package com.redepronik.negosys.invfac.service;

import static com.redepronik.negosys.utils.Utils.compareTo;
import static com.redepronik.negosys.utils.Utils.moraTotal;
import static com.redepronik.negosys.utils.Utils.multiplicarDivide;
import static com.redepronik.negosys.utils.Utils.newBigDecimal;
import static com.redepronik.negosys.utils.Utils.redondearTotales;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.redepronik.negosys.invfac.dao.CreditoDao;
import com.redepronik.negosys.invfac.entity.Credito;
import com.redepronik.negosys.invfac.entity.Detallecredito;
import com.redepronik.negosys.invfac.entityAux.CantidadesCreditoReporte;

@Service
public class CreditoServiceImpl implements CreditoService {

	@Autowired
	private CreditoDao creditoDao;

	@Autowired
	private MoraService moraService;

	public CantidadesCreditoReporte calcularCuota(
			Detallecredito detallesCredito,
			CantidadesCreditoReporte cantidadesCreditoReporte,
			Date fechaEgreso, Date fecha) {
		cantidadesCreditoReporte
				.setSaldoCredito(redondearTotales(detallesCredito.getSaldo()));
		cantidadesCreditoReporte.setMoraCredito(newBigDecimal());
		cantidadesCreditoReporte
				.setTotalCredito(redondearTotales(detallesCredito.getSaldo()));
		if (compareTo(fecha, detallesCredito.getFechamora()) >= 0) {
			BigDecimal mora = moraService.obtenerPorFecha(fechaEgreso)
					.getPorcentaje();
			BigDecimal moraTotal = moraTotal(fecha,
					detallesCredito.getFechamora(), mora);
			cantidadesCreditoReporte
					.setMoraCredito(redondearTotales(multiplicarDivide(
							moraTotal, detallesCredito.getSaldo())));
			cantidadesCreditoReporte
					.setTotalCredito(redondearTotales(detallesCredito
							.getSaldo().add(
									cantidadesCreditoReporte.getMoraCredito())));
		}
		return cantidadesCreditoReporte;
	}

	public String actualizar(Credito credito) {
		// if (!creditoDao.comprobarIndices(Credito.class, "nombre",
		// credito.getNombre(), String.valueOf(credito.getCreditoid()))) {
		// creditoDao.actualizar(credito);
		// return "SAVE";
		// } else
		return "EL BANCO YA EXISTE";
	}

	public void eliminar(Credito credito) {
		// if (credito.getActivo())
		// credito.setActivo(false);
		// else
		// credito.setActivo(true);
		// creditoDao.actualizar(credito);
	}

	public String insertar(Credito credito) {
		// if (!creditoDao.comprobarIndices(Credito.class, "nombre",
		// credito.getNombre(), String.valueOf(credito.getCreditoid()))) {
		// credito.setActivo(true);
		// creditoDao.insertar(credito);
		// return "SAVE";
		// } else
		return "EL BANCO YA EXISTE";
	}

	public List<Credito> obtener(Boolean activo) {
		return creditoDao.obtener(Credito.class, "nombre", activo);
	}

	public Credito obtenerPorCreditoId(Integer creditoId) {
		return creditoDao.obtenerPorId(Credito.class, creditoId);
	}

	public List<Credito> obtenerPorCliente(String cedula) {
		return creditoDao.obtenerPorHql(
				"select c from Egreso e inner join e.credito c",
				// + "inner join c.egreso e ",
				// + "inner join e.cliente cl inner join cl.persona p ",
				// + "left join fetch c.garantes g "
				// + "where p.cedula=?1 order by e.fechainicio",
				new Object[] {});
	}
}